/**
 * 
 */
package registnet.courseDemand;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * The interface that holds the constants for the program
 * 
 * @author Dexter Ryan Carrasco
 */
public interface CourseDemandConstants {

	/*
	 * Constants that specifies the common time schedule. This is based on the
	 * Schedule matrix
	 */

	// common one hour schedule
	public static final int ONE_HOUR = 2;
	public static final int[] SEVEN_TO_EIGHT = { 0, 1 };
	public static final int[] EIGHT_TO_NINE = { 2, 3 };
	public static final int[] NINE_TO_TEN = { 4, 5 };
	public static final int[] TEN_TO_ELEVEN = { 6, 7 };
	public static final int[] ELEVEN_TO_TWELVE = { 8, 9 };
	public static final int[] TWELVE_TO_ONE = { 10, 11 };
	public static final int[] ONE_TO_TWO = { 12, 13 };
	public static final int[] TWO_TO_THREE = { 14, 15 };
	public static final int[] THREE_TO_FOUR = { 16, 17 };
	public static final int[] FOUR_TO_FIVE = { 18, 19 };
	public static final int[] FIVE_TO_SIX = { 20, 21 };
	public static final int[] SIX_TO_SEVEN = { 22, 23 };

	// common one and a half hour schedule
	public static final int ONE_HOUR_HALF = 3;
	public static final int[] SEVEN_TO_EIGHT_THIRTY = { 0, 2 };
	public static final int[] EIGHT_THIRTY_TO_TEN = { 3, 5 };
	public static final int[] TEN_TO_ELEVEN_THIRTY = { 6, 8 };
	public static final int[] ELEVEN_THIRTY_TO_ONE = { 9, 11 };
	public static final int[] ONE_TO_TWO_THIRTY = { 12, 14 };
	public static final int[] TWO_THIRTY_TO_FOUR = { 15, 17 };
	public static final int[] FOUR_TO_FIVE_THIRTY = { 18, 20 };
	public static final int[] FIVE_THIRTY_TO_SEVEN = { 21, 23 };

	// common two hours schedule
	public static final int TWO_HOURS = 4;
	public static final int[] SEVEN_TO_NINE = { 0, 3 };
	public static final int[] NINE_TO_ELEVEN = { 4, 7 };
	public static final int[] ELEVEN_TO_ONE = { 8, 11 };
	public static final int[] ONE_TO_THREE = { 12, 15 };
	public static final int[] THREE_TO_FIVE = { 16, 19 };
	public static final int[] FIVE_TO_SEVEN = { 20, 23 };

	// common three hours schedule
	public static final int THREE_HOURS = 6;
	public static final int[] SEVEN_TO_TEN = { 0, 5 };
	public static final int[] TEN_TO_ONE = { 6, 11 };
	public static final int[] ONE_TO_FOUR = { 12, 17 };
	public static final int[] FOUR_TO_SEVEN = { 18, 23 };

	// common six hours schedule
	public static final int FIVE_HOURS = 10;
	public static final int[] SEVEN_TO_TWELVE = { 0, 9 };
	public static final int[] TWELVE_TO_FIVE = { 10, 19 };

	// common six hours schedule
	public static final int SIX_HOURS = 12;
	public static final int[] SEVEN_TO_ONE = { 0, 11 };
	public static final int[] TEN_TO_FOUR = { 6, 17 };
	public static final int[] ONE_TO_SEVEN = { 12, 23 };

	/*
	 * List Constants that specifies the time priorities
	 */

	/** priority time for courses with one hour schedule */
	public static final List<int[]> ONE_HOUR_LEC_WITH_LAB_SKED_PRIORITY = new ArrayList<int[]>(
			Arrays.asList(NINE_TO_TEN, EIGHT_TO_NINE, FOUR_TO_FIVE,
					TEN_TO_ELEVEN, THREE_TO_FOUR, TWO_TO_THREE,
					ELEVEN_TO_TWELVE, ONE_TO_TWO, TWELVE_TO_ONE, FIVE_TO_SIX,
					SEVEN_TO_EIGHT, SIX_TO_SEVEN));

	/** priority time for courses with one and a half hour schedule */
	public static final List<int[]> ONE_HOUR_HALF_LEC_SKED_PRIORITY = new ArrayList<int[]>(
			Arrays.asList(EIGHT_THIRTY_TO_TEN, TEN_TO_ELEVEN_THIRTY,
					ELEVEN_THIRTY_TO_ONE, ONE_TO_TWO_THIRTY,
					TWO_THIRTY_TO_FOUR, FOUR_TO_FIVE_THIRTY,
					FIVE_THIRTY_TO_SEVEN, SEVEN_TO_EIGHT_THIRTY));

	/** priority time for courses with two hours schedule */
	public static final List<int[]> TWO_HOURS_SKED_PRIORITY = new ArrayList<int[]>(
			Arrays.asList(NINE_TO_ELEVEN, ELEVEN_TO_ONE, ONE_TO_THREE,
					THREE_TO_FIVE, FIVE_TO_SEVEN, SEVEN_TO_NINE));

	/** priority time for courses with three hours schedule */
	public static final List<int[]> THREE_HOURS_SKED_PRIORITY = new ArrayList<int[]>(
			Arrays.asList(TEN_TO_ONE, ONE_TO_FOUR, FOUR_TO_SEVEN, SEVEN_TO_TEN));

	/** priority time for courses with six hours schedule */
	public static final List<int[]> FIVE_HOURS_SKED_PRIORITY = new ArrayList<int[]>(
			Arrays.asList(SEVEN_TO_TWELVE, TWELVE_TO_FIVE));

	/** priority time for courses with six hours schedule */
	public static final List<int[]> SIX_HOURS_SKED_PRIORITY = new ArrayList<int[]>(
			Arrays.asList(TEN_TO_FOUR, ONE_TO_SEVEN, SEVEN_TO_ONE));

	/* Constants for days of the week. This is based on Schedule matrix */
	public static final int MONDAY = 0;
	public static final int TUESDAY = 1;
	public static final int WEDNESDAY = 2;
	public static final int THURSDAY = 3;
	public static final int FRIDAY = 4;
	public static final int SATURDAY = 5;

	/* Constants for the number of sessions per week */
	public static final int ONE_DAY = 1;
	public static final int TWO_DAYS = 2;
	public static final int THREE_DAYS = 3;
	public static final int FOUR_DAYS = 4;
	public static final int FIVE_DAYS = 5;

	/* Constants for the course type */
	public static final int MAJOR_COURSES = 1;
	public static final int GE_COURSES = 0;
	public static final int PE_COURSES = 3;
	public static final int NSTP_COURSES = 4;

	/* Constants for slot status */
	public static final int SLOT_RESERVED = 3;
	public static final int SLOT_VACANT = 0;

	/* Constants for special cases */
	// when maximum number of students is zero, this UNLIMITED_SLOTS value will
	// be used
	public static final int UNLIMITED_SLOTS = 100;
}
